#include <kuai/mol/molid.hpp>
#include <kuai/mol/space.hpp>
#include <kuai/sim/energy.hpp>


namespace kuai {

	extern const char*	MOL_INFO_NULL = "";
	extern const char* 	MOL_INFO_CT = "connect_table";
	extern const char* 	MOL_INFO_FINGER_PRINTER = "finger_printer";
	extern const char* 	MOL_INFO_PBC = "pbc";

	extern const char* 	MOL_INFO_ATOM_COORD_2D = "coord2d";
	extern const char* 	MOL_INFO_ATOM_COORD_3D = "coord3d";

		// MOL_INFO_ATOM_MASS,
	extern const char* 	MOL_INFO_ATOM_CHARGE = "charges";
	extern const char* 	MOL_INFO_ATOM_ISO = "isotopes";
	extern const char* 	MOL_INFO_ATOM_RADICAL = "radical";
	extern const char* 	MOL_INFO_ATOM_STEREO = "atom_stereo";
	extern const char* 	MOL_INFO_ATOM_IMPLICIT_H = "implicit_h";
	extern const char* 	MOL_INFO_ATOM_VALENCE = "valence";

	extern const char* 	MOL_INFO_ATOM_MASS = "mass";
	extern const char* 	MOL_INFO_ATOM_R_MASS = "rmass";

	extern const char* 	MOL_INFO_BOND_ORDER = "bond_order";
	extern const char* 	MOL_INFO_BOND_RANK = "bond_rank";
	extern const char* 	MOL_INFO_BOND_STEREO = "bond_stereo";

	extern const char* 	RXN_INFO_ATOM_AAM = "atom_aa_map";
	extern const char* 	RXN_INFO_ATOM_INVERSION = "atom_inversion";

	extern const char* 	RXN_INFO_BOND_CENTER = "rxn_center";

	extern const char* 	SIM_INFO_PARAMETERS = "parameters";
	extern const char* 	SIM_INFO_POTENTIALS = "potentials";

	extern const char* 	SIM_INFO_ATOM_SPEEDS = "speeds";
	extern const char* 	SIM_INFO_ATOM_FORCES = "forces";

	extern const char* 	SIM_INFO_TEMPERATURE = "temperature";
	extern const char* 	SIM_INFO_TEMPERATURE0 = "temperature0";
	extern const char* 	SIM_INFO_BRENDSON_T = "brendson_t";
	extern const char* 	SIM_INFO_ANDERSON_T = "anderson_t";

	extern const char* 	SIM_INFO_PRESSURE = "pressure";
	extern const char* 	SIM_INFO_PRESSURE0 = "pressure0";

	SimObjFactory::SimObjFactory() {
		funcs[MOL_INFO_PBC]=createSingleProperty<PBC>;
		funcs[MOL_INFO_CT]=createPropertyConnectTable;
		funcs[MOL_INFO_FINGER_PRINTER]=createArrayPropertyN<Byte, 16>;

		funcs[MOL_INFO_ATOM_COORD_2D]= createArrayPropertyOfAtoms<XYZ>;
		funcs[MOL_INFO_ATOM_COORD_3D]= createArrayPropertyOfAtoms<XYZ>;
		funcs[SIM_INFO_ATOM_SPEEDS]= createArrayPropertyOfAtoms<XYZ>;
		funcs[SIM_INFO_ATOM_FORCES]= createArrayPropertyOfAtoms<XYZ>;

		funcs[MOL_INFO_ATOM_MASS]= createArrayPropertyOfAtoms<RealNumber>;
		funcs[MOL_INFO_ATOM_R_MASS]= createArrayPropertyOfAtoms<RealNumber>;

		funcs[MOL_INFO_ATOM_CHARGE]= createArrayPropertyOfAtoms<Integer>;
		funcs[MOL_INFO_ATOM_ISO]= createArrayPropertyOfAtoms<Index>;
		funcs[MOL_INFO_ATOM_RADICAL]= createArrayPropertyOfAtoms<Index>;
		funcs[MOL_INFO_ATOM_STEREO]= createArrayPropertyOfAtoms<Index>;
		funcs[MOL_INFO_ATOM_IMPLICIT_H]= createArrayPropertyOfAtoms<Index>;
		funcs[MOL_INFO_ATOM_VALENCE]= createArrayPropertyOfAtoms<Index>;

		funcs[MOL_INFO_BOND_ORDER]= createArrayPropertyOfBonds<Index>;
		funcs[MOL_INFO_BOND_RANK]= createArrayPropertyOfBonds<Index>;
		funcs[MOL_INFO_BOND_STEREO]= createArrayPropertyOfBonds<Index>;

		funcs[SIM_INFO_PARAMETERS]= createArrayProperty0<RealNumber>;

		/*
	
		extern const char* 	RXN_INFO_ATOM_AAM = "atom_aa_map";
		extern const char* 	RXN_INFO_ATOM_INVERSION = "atom_inversion";
		extern const char* 	RXN_INFO_BOND_CENTER = "rxn_center";

		*/
	
	}

}
